package org.usmile.algorithms.leetcode.middle;

import org.usmile.algorithms.leetcode.ListNode;

/**
 * 86. 分隔链表
 *
 * 给你一个链表的头节点 head 和一个特定值 x ，请你对链表进行分隔，使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
 * 你应当 保留 两个分区中每个节点的初始相对位置。
 *
 * 示例 1：
 * 输入：head = [1,4,3,2,5,2], x = 3
 * 输出：[1,2,2,4,3,5]
 *
 * 示例 2：
 * 输入：head = [2,1], x = 2
 * 输出：[1,2]
 *
 * 提示：
 * 链表中节点的数目在范围 [0, 200] 内
 * -100 <= Node.val <= 100
 * -200 <= x <= 200
 */
public class _0086 {
}

class _0086_Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode smallerHead = new ListNode();
        ListNode biggerHead = new ListNode();
        ListNode sPre = smallerHead;
        ListNode bPre = biggerHead;
        ListNode curr = head;
        while (curr != null) {
            if (curr.val < x) {
                sPre.next = curr;
                sPre = sPre.next;
            } else {
                bPre.next = curr;
                bPre = bPre.next;
            }

            curr = curr.next;
        }
        sPre.next = null;
        bPre.next = null;

        if (smallerHead.next != null) {
            sPre.next = biggerHead.next;
        } else {
            return head;
        }

        return smallerHead.next;
    }
}